<?php
use think\Request;
use think\Db; 
/**
 * 字符串命名风格转换
 * type 0 将Java风格转换为C的风格 1 将C风格转换为Java的风格
 * @param string $name 字符串
 * @param integer $type 转换类型
 * @param bool $uc_first 首字母是否大写（驼峰规则）
 * @return string
 */
function parse_name_style($name, $type = 0, $uc_first = true)
{
    if ($type) {
        $name = preg_replace_callback('/_([a-zA-Z])/', function ($match) {
            return strtoupper($match[1]);
        }, $name);
        return $uc_first ? ucfirst($name) : lcfirst($name);
    } else {
        return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_"));
    }
}

/**
 * 获取客户端设备类型
 * @param integer $type 0=>返回字符串形式 1=>返回数字形式（同步DB字段配置）
 * @return integer|string
 */
function get_client_device($type = 1)
{
    $client_type = ['pc' => 0, 'mobile' => 1, 'app' => 2, 'wechat' => 3];
    $client_device = Request::instance()->param('client_device', '', 'trim,strip_tags');
    if (in_array($client_device, array('pc', 'mobile', 'app', 'wechat'))) {
        session('client_device', $client_device);
        return $type ? $client_type[$client_device] : $client_device;
    }
    if (isset($_SERVER['HTTP_USER_AGENT'])) {
        if (stristr($_SERVER['HTTP_USER_AGENT'], 'DongringApp(Apicloud)')) {
            session('client_device', 'app');
            return $type ? $client_type['app'] : 'app';
        } else {
            if (stristr($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger')) {
                session('client_device', 'wechat');
                return $type ? $client_type['wechat'] : 'wechat';
            }
        }
    }
    // 如果有HTTP_X_WAP_PROFILE则一定是移动设备
    if (isset($_SERVER['HTTP_X_WAP_PROFILE'])) {
        session('client_device', 'mobile');
        return $type ? $client_type['mobile'] : 'mobile';
    }
    //此条摘自TPM智能切换模板引擎，适合TPM开发
    if (isset($_SERVER['HTTP_CLIENT']) && 'PhoneClient' == $_SERVER['HTTP_CLIENT']) {
        session('client_device', 'mobile');
        return $type ? $client_type['mobile'] : 'mobile';
    }
    //如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
    if (isset($_SERVER['HTTP_VIA'])) {
        if (stristr($_SERVER['HTTP_VIA'], 'wap')) {
            session('client_device', 'mobile');
            return $type ? $client_type['mobile'] : 'mobile';
        } else {
            session('client_device', 'pc');
            return $type ? $client_type['pc'] : 'pc';
        }
    }
    //判断手机发送的客户端标志,兼容性有待提高
    if (isset($_SERVER['HTTP_USER_AGENT'])) {
        $client_keywords = array('mobile', 'micromessenger', 'ucweb', 'xiaomi', 'nokia', 'sony', 'ericsson', 'mot', 'samsung', 'htc', 'sgh', 'lg', 'sharp', 'sie-', 'philips', 'panasonic', 'alcatel', 'lenovo', 'iphone', 'ipod', 'blackberry', 'meizu', 'android', 'netfront', 'symbian', 'windowsce', 'palm', 'operamini', 'operamobi', 'openwave', 'nexusone', 'cldc', 'midp', 'wap');
        //从HTTP_USER_AGENT中查找手机浏览器的关键字
        if (preg_match("/(" . implode('|', $client_keywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
            session('client_device', 'mobile');
            return $type ? $client_type['mobile'] : 'mobile';
        }
    }
    //协议法，因为有可能不准确，放到最后判断
    if (isset($_SERVER['HTTP_ACCEPT'])) {
        // 如果只支持wml并且不支持html那一定是移动设备
        // 如果支持wml和html但是wml在html之前则是移动设备
        if (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html'))) {
            session('client_device', 'mobile');
            return $type ? $client_type['mobile'] : 'mobile';
        }
    }
    session('client_device', 'pc');
    return $type ? $client_type['pc'] : 'pc';
}
function get_client_device_by_name($name = '')
{
    $name = strip_tags(trim($name));
    $client_type = ['pc' => 0, 'mobile' => 1, 'app' => 2, 'wechat' => 3];
    return isset($client_type[$name]) ? $client_type[$name] : 0;
}
function get_client_device_by_id($id = 0)
{
    $id = intval($id);
    $client_type = [0 => 'pc', 1 => 'mobile', 2 => 'app', 3 => 'wechat'];
    return isset($client_type[$id]) ? $id : 0;
}

/**
 * 数据签名认证
 * @param  string|array $mix 被认证的数据
 * @return string   签名
 */
function data_auth_sign($mix)
{
    if (is_object($mix)) {
        $mix = spl_object_hash($mix);
    } elseif (is_resource($mix)) {
        $mix = get_resource_type($mix) . strval($mix);
    } else {
        $mix = serialize($mix);
    }
    $sign = strtolower(md5(config('auth_data_salt') . sha1($mix)));
    //生成签名
    return $sign;
}
/**
 * 系统加密方法
 * @param string $data 要加密的字符串
 * @param string $key 加密密钥
 * @param int $expire 过期时间 单位 秒 (不用加time时间戳）
 * @return string
 */
function data_encrypt($data, $key = '', $expire = 0)
{
    $key = md5(empty($key) ? config('auth_data_salt') : $key);
    $data = base64_encode($data);
    $x = 0;
    $len = strlen($data);
    $l = strlen($key);
    $char = '';
    for ($i = 0; $i < $len; $i++) {
        if ($x == $l) {
            $x = 0;
        }
        $char .= substr($key, $x, 1);
        $x++;
    }
    $str = sprintf('%010d', $expire ? $expire + time() : 0);
    for ($i = 0; $i < $len; $i++) {
        $str .= chr(ord(substr($data, $i, 1)) + ord(substr($char, $i, 1)) % 256);
    }
    return str_replace(array('+', '/', '='), array('-', '_', ''), base64_encode($str));
}
/**
 * 系统解密方法
 * @param  string $data 要解密的字符串 （必须是data_encrypt方法加密的字符串）
 * @param  string $key 加密密钥
 * @return string
 */
function data_decrypt($data, $key = '')
{
    $key = md5(empty($key) ? config('data_auth_salt') : $key);
    $data = str_replace(array('-', '_'), array('+', '/'), $data);
    $mod4 = strlen($data) % 4;
    if ($mod4) {
        $data .= substr('====', $mod4);
    }
    $data = base64_decode($data);
    $expire = substr($data, 0, 10);
    $data = substr($data, 10);
    if ($expire > 0 && $expire < time()) {
        return '';
    }
    $x = 0;
    $len = strlen($data);
    $l = strlen($key);
    $char = $str = '';
    for ($i = 0; $i < $len; $i++) {
        if ($x == $l) {
            $x = 0;
        }
        $char .= substr($key, $x, 1);
        $x++;
    }
    for ($i = 0; $i < $len; $i++) {
        if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))) {
            $str .= chr(ord(substr($data, $i, 1)) + 256 - ord(substr($char, $i, 1)));
        } else {
            $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
        }
    }
    return base64_decode($str);
}

//快捷方法：获得单前会话用户的ID
function get_user_id()
{
    $id = session('account.supplier_user_id');
    return empty($id) || is_null($id) || $id < 0 ? 0 : $id;
}

//生成随机密码
function get_rand_pass($length = 6){
    $password = '';
    //将你想要的字符添加到下面字符串中，默认是数字0-9和26个英文字母
    $chars = "0123456789";
    $char_len = strlen($chars);
    for($i=0;$i<$length;$i++){
        $loop = mt_rand(0, ($char_len-1));
        //将这个字符串当作一个数组，随机取出一个字符，并循环拼接成你需要的位数
        $password .= $chars[$loop];
    }
    return $password;
}

function get_supplier_id(){
    $id = session('account.supplier_id');
    return !empty($id)?$id:0;
}

// 处理带Emoji的数据，type=0表示写入数据库前的emoji转为HTML，为1时表示HTML转为emoji码
function deal_emoji($msg, $type = 1) {
    if ($type == 0) {
        $msg = json_encode ( $msg );
    } else {
        $txt = json_decode ( $msg );
        if ($txt !== null) {
            $msg = $txt;
        }
    }
    return $msg;
}